import qs from "qs";
// //编写一个防抖函数
/**
 * 防抖函数，限制函数的执行频率
 * @param {Function} fn - 需要防抖的函数
 * @param {number} delay - 延迟时间，单位为毫秒
 * @returns {Function} - 防抖后的函数
 */
export function debounce(fn, delay) {
  var timer = null; // 声明计时器
  return function () {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn.apply(context, args);
    }, delay);
  };
}

// 编写一个节流函数
/**
 * 节流函数，限制函数的执行频率
 * @param {Function} fn - 需要节流的函数
 * @param {number} interval - 间隔时间，单位为毫秒
 * @returns {Function} - 节流后的函数
 */
export function throttle(fn, interval) {
  var last = 0; // 上次执行的时间
  return function () {
    var context = this;
    var args = arguments;
    var now = Date.now(); // 当前时间
    if (now - last >= interval) {
      fn.apply(context, args);
      last = now;
    }
  };
}
// 编写一个深拷贝函数
export function deepClone(obj) {
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }
  var cloneObj = Array.isArray(obj) ? [] : {};
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      cloneObj[key] = deepClone(obj[key]);
    }
  }
}
//编写一个数组去重函数
export function unique(arr) {
  return Array.from(new Set(arr));
}

// $localStorage 类用于处理本地存储的键值对
export const $localStorage = {
  /**
   *@params expires 过期时间,单位毫秒
   */
  // 设置一个键值对到本地存储中，支持设置过期时间
  setItem(key, value, expires) {
    const data = {
      value: value,
      time: Date.now(),
      expires: expires,
    };
    window.localStorage.setItem(key, qs.stringify(data));
  },
  // 从本地存储中获取指定的键值对
  getItem(key) {
    const dataStr = window.localStorage.getItem(key);
    if (!dataStr) return dataStr;
    const data = qs.parse(dataStr);
    // 检查是否过期，若过期则删除并返回 null
    if (data.expires && Date.now() - data.time > data.expires) {
      window.localStorage.removeItem(key);
      return null;
    }
    return data.value;
  },
  // 从本地存储中移除指定的键值对
  removeItem(key) {
    window.localStorage.removeItem(key);
  },
};

// $sessionStorage 类用于处理会话存储的键值对
export const $sessionStorage = {
  // 设置一个键值对到会话存储中
  setItem(key, value) {
    window.sessionStorage.setItem(key, value);
  },
  // 从会话存储中获取指定的键值对
  getItem(key) {
    return window.sessionStorage.getItem(key);
  },
  // 从会话存储中移除指定的键值对
  removeItem(key) {
    window.sessionStorage.removeItem(key);
  },
};
